4.3 ResponseWriter
首先创建一个 Response 结构,接着将数据存储到这个结构里面,最后将这个结构返回给客户端——如果你认为服务器是通过这种方式向客户端返回响应的,那么你就错了:服务器在向客户端返回响应的时候,真正需要用到的是 ResponseWriter 接口。
ResponseWriter 是一个接口,处理器可以通过这个接口创建HTTP响应。 ResponseWriter 在创建响应时会用到 http.response 结构,因为该结构是一个非导出(nonexported)的结构,所以用户只能通过 ResponseWriter 来使用这个结构,而不能直接使用它。
为什么要以传值的方式将ResponseWriter传递给ServeHTTP
在阅读了本章前面的内容之后,有的读者可能会感到疑惑——
ServeHTTP为什么要接受ResponseWriter接口和一个指向Request结构的指针作为参数呢?接受Request结构指针的原因很简单:为了让服务器能够察觉到处理器对Request结构的修改,我们必须以传引用(pass by reference)而不是传值(pass by value)的方式传递Request结构。但是另一方面,为什么ServeHTTP却是以传值的方式接受ResponseWriter呢?难道服务器不需要知道处理器对ResponseWriter所做的修改吗? 对于这个问题,如果我们深入探究net/http库的源码,就会发现ResponseWriter实际上就是response这个非导出结构的接口,而ResponseWriter在使用response结构时,传递的也是指向response结构的指针,这也就是说,ResponseWriter是以传引用而不是传值的方式在使用response结构。 换句话说,实际上ServeHTTP函数的两个参数传递的都是引用而不是值——虽然ResponseWriter看上去像是一个值,但它实际上却是一个带有结构指针的接口。
ResponseWriter 接口拥有以下3个方法:
Write;WriteHeader;Header。